import axios from 'axios';
import store from '../store';
import {ACCESS_TOKEN} from "@/store/mutations-type";
import {setTokenCookie, removeTokenCookie, getTokenCookie} from "./auth";
import {Modal, notification} from 'ant-design-vue';

let apiBaseUrl = '/api';
// 创建axios实例
const service = axios.create({
    baseURL: apiBaseUrl, // api base_url
    timeout: 9000 // 请求超时时间
});

// request拦截器
service.interceptors.request.use(config => {
    // 拦截所有请求，并将其请求头位置加入token信息 - 这里拿去的是vuex中的token- mian.js中将token存入了
    config.headers[ACCESS_TOKEN] = getTokenCookie();
    return config;
}, error => {
    // 如果发生请求异常
    console.log(error);// for debug
    Promise.reject(error);
});

// response拦截器 - 注意经过本次拦截 所有和这个有关的请求返回对象只是统一的返回格式 result{ code message record }
service.interceptors.response.use(
    (response) => {
        /**
         * 拦截每一次响应 获取响应头中的token内容
         */
            // 只要请求头中的authentication字段存有信息 则将其存入cookie中
        const token = response.headers.authentication;
        if (token !== null && token !== '' && "undefined" !== typeof token) {
            setTokenCookie(token);
            store.commit("SET_TOKEN", token);
        }
        return response.data;

    },
    (error) => {
        if (error.response) {
            let data = error.response.data;
            const token = getTokenCookie;
            console.log("------异常响应------", token);
            console.log("------异常响应------", error.response.status);
            switch (error.response.status) {
                case 403:
                    notification.error({message: '系统提示', description: '拒绝访问', duration: 4});
                    break;
                case 500:
                    if (token && data.message.contains("Token失效，请重新登录!")) {
                        Modal.error({
                            title: '登录已过期',
                            content: '你已被登出，可以取消继续留在该页面，或者重新登录',
                            okText: '重新登录',
                            mask: false,
                            onOk: () => {
                                // 移除cookie中的无效token信息
                                removeTokenCookie();
                                store.commit("SET_TOKEN", null);
                                let that = this;
                                try {
                                    let path = that.$route.path;
                                    if (path.indexOf('/home/welcome') === -1) {
                                        window.location.reload()
                                    }
                                } catch (e) {
                                    window.location.reload()
                                }
                            }
                        });
                    }
                    break;
                case 404:
                    notification.error({message: '系统提示', description: '很抱歉，资源未找到!', duration: 4});
                    break;
                case 504:
                    notification.error({message: '系统提示', description: '网络超时'});
                    break;
                case 401:
                    notification.error({message: '系统提示', description: '未授权，请重新登录', duration: 4});
                    if (token) {
                        removeTokenCookie();
                        store.commit("SET_TOKEN", null);
                        setTimeout(() => {
                            window.location.reload()
                        }, 2500);
                    }
                    break;
                default:
                    notification.error({
                        message: '系统提示',
                        description: data.message,
                        duration: 4
                    });
                    break;
            }
        }
        return Promise.reject(error)
    });

export default service;
